package br.unicamp.ic.sgct.server.dominio.entidades;

import br.unicamp.ic.sgct.client.dominio.to.AreaTO;
import javax.persistence.Entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

import javax.persistence.Table;

import br.unicamp.ic.sgct.client.dominio.to.AutorTO;
import br.unicamp.ic.sgct.client.dominio.to.TrabalhoTO;
import br.unicamp.ic.sgct.client.dominio.to.UsuarioTO;
import br.unicamp.ic.sgct.server.recursos.persistencia.LOGGER;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;

@Entity(name = "Autor")
@Table(name = "T_AUTOR")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorValue(value = "AUTOR")
public abstract class Autor extends Usuario {

    /**
     *
     */
    private static final long serialVersionUID = 4574840485223345580L;

    public Autor(){

    }
    
    public Autor(AutorTO to){
        super(to);
    }

    @ManyToMany(fetch = FetchType.LAZY, targetEntity = Trabalho.class)
    @JoinTable(name = "T_TRABALHO_AUTOR",
        joinColumns = @JoinColumn(name = "AUTOR_ID", referencedColumnName = "ID_USUARIO"),
        inverseJoinColumns = @JoinColumn(name = "TRABALHO_ID", referencedColumnName = "ID_TRABALHO")
    )
    private Set<Trabalho> trabalhos;


    @ManyToMany(fetch = FetchType.LAZY, targetEntity = Area.class)
    @JoinTable(name = "T_AREA_AUTOR",
        joinColumns = @JoinColumn(name = "AUTOR_ID", referencedColumnName = "ID_USUARIO"),
        inverseJoinColumns = @JoinColumn(name = "AREA_ID", referencedColumnName = "ID_AREA")
    )
    private Set<Area> areas;

    public abstract AutorTO getAutorTOEspecifico();

    public AutorTO getAutorTO() {
        LOGGER.debug("AutorTO getAutorTO");
        AutorTO autorTO = this.getAutorTOEspecifico();
        
        return autorTO;
    }

    @Override
    public UsuarioTO getTo() {
        LOGGER.debug("AutorTO  getTo");
        AutorTO autorTO = getAutorTO();
        List<TrabalhoTO> trabalhosTO = new ArrayList<TrabalhoTO>();
        if (getTrabalhos() != null && !getTrabalhos().isEmpty()) {
            for (Trabalho trabalho : trabalhos) {
                trabalhosTO.add(trabalho.getTo());
            }
        }
        autorTO.setTrabalhos(trabalhosTO);
        List<AreaTO> areasTO = new ArrayList<AreaTO>();
        autorTO.setAreasTO(areasTO);
        for (Area area : areas) {
            if(area != null)
            areasTO.add(area.getTo());
        }
        return autorTO;
    }

    /**
     * @return the trabalhos
     */
    public Set<Trabalho> getTrabalhos() {
        return trabalhos;
    }

    /**
     * @param trabalhos the trabalhos to set
     */
    public void setTrabalhos(Set<Trabalho> trabalhos) {
        this.trabalhos = trabalhos;
    }


    public static void gerar(AutorTO autorTO, Autor autor){
        autor.setDataEfetivacaoPagto(autorTO.getDataEfetivacaoPagto());
        autor.setEmail(autorTO.getEmail());
        autor.setInscricaoAtiva(autorTO.getInscricaoAtiva());
        //autor.setPessoa(autorTO.getPessoa());
        autor.setSenha(autorTO.getSenha());
        autor.setId(autorTO.getId());
        //autor.setTrabalhos(autorTO.getTrabalhos());
    }

    /**
     * @return the areas
     */
    public Set<Area> getAreas() {
        return areas;
    }

    /**
     * @param areas the areas to set
     */
    public void setAreas(Set<Area> areas) {
        this.areas = areas;
    }
}
